(function(){
	/**
	 * 1.提供返回面积的方法，中心点，半径。有些其实就是通过circle的绘图来返回。只是在这个对象里，再提供一次，为了方便而已。
	 * 2.按照autonavi官网的方案，但是要改ui样式。
	 * 3.在拖动circle时，要保证圆边的marker点也移动。
	 * 4.保证只有一个愿编辑可控制一个圆形。
	 *  
	 * 实现：
	 * 1.
	 * 2.
	 * 3.centerMarker,外边marker
	 */
	
	MMap.CircleEditor=MMap.Class({
		version:1.0,
		
		/*
		 * 初始化方法,保证ciecle对象为cicle，以及没有被其他编辑对象索编辑
		 * 
		 */
		initialize:function(circle,opt){
		  	function i(){
		  		opt=opt||{};
		  		this.circle=circle;
		  		this.mapobj=this.circle._map;
		  		this.synId="_polylineEditor_"+Math.floor(Math.random()*1000);
		  		this.mMarkerIndex=1;
		  		this.opt={
		  			centerMarkerIcon:opt["centerMarkerIcon"]||this.mapobj._client+"Images/point.png",
		  			outerMarkerIcon:opt["outerMarkerIcon"]||this.mapobj._client+"Images/point.png"
		  		}
		  		
		  		
		  	}
		  	this.flag=(typeof circle!=="undefined"&&circle instanceof MMap.Circle&&typeof circle["_edit"]==="undefined");
		  	this.flag&&this.mEnv(i);
		},
		/*
		 * 执行环境作用域
		 */
		
		
		mEnv:function(fn){
			return typeof fn==="function"&&fn.apply(this,Array.prototype.slice.call(arguments,1));
		},
		
		mBuildMarker:function(position,n){
			return new MMap.Marker({
				draggable:true,
				icon:n==1?this.opt["centerMarkerIcon"]:this.opt["outerMarkerIcon"],
				position:position,
				//真奇怪这里，marker点竟然和折线的点的位置不在同一个位置，必须得加上这个偏移量
				offset:{x:-6,y:-6},
				id:this.synId+(this.mMarkerIndex++).toString(36)
			});
		},
		getCenter:function(){
			return this.circle.getCenter();
		},
		getRadius:function(){
			return this.circle.getRadius();
		},
		getArea:function(){
			return (this.getRadius()*this.getRadius()*Math.PI).toFixed(5);
		},
		mCreateCenterMarker:function(){
			//
			var obj=this,temp=new MMap.LngLat(0.0,0.0);
			//记录拖拽开始时，中心带你的位置，方便计算拖拽过程中的position
			function d(){
				obj.mapobj.bind(obj.cMarker,"dragging",i);
				obj.mapobj.bind(obj.cMarker,"mouseup",e);
				obj.oMarker._lnglat=obj.oMarker.getPosition();
				obj.cMarker._lnglat=obj.cMarker.getPosition();
			}
			//此处说明一下，如果以事件产生的经纬度为圆的中心点
			//那么会造成中心点marker有微小差异的情况。
			//如果以marker点的getPosition的到marker点的
			//position然后以这个position为中心点则可以避免这个误差,但是由于getPosition方法会计算较多所以会有一定的效率问题
			//
			function i(e){
				var p=obj.cMarker.getPosition();
				obj.circle.setCenter(p);
				obj.oMarker.setPosition(caculate(p));
				
			}
			function e(e){
				obj.mapobj.unbind(obj.cMarker,"dragging",i);
				obj.mapobj.unbind(obj.cMarker,"mouseup",arguments.callee);
				delete obj.oMarker._lnglat;
				delete obj.cMarker._lnglat;
			}
			function caculate(p){
				temp.lng=p.lng-obj.cMarker._lnglat.lng+obj.oMarker._lnglat.lng;
				temp.lat=p.lat-obj.cMarker._lnglat.lat+obj.oMarker._lnglat.lat;
				return temp;
			}
			this.cMarker=this.mBuildMarker(this.circle.getCenter(), 1);
			this.mapobj.addOverlays(this.cMarker);
			this.mapobj.bind(this.cMarker,"mousedown",d);
			
		},
		mCreateOuterMarker:function(position){
			var obj=this;
			
			function d(){
				obj.mapobj.bind(obj.oMarker,"dragging",i);
				obj.mapobj.bind(obj.oMarker,"mouseup",e);
				obj.cMarker._lnglat=obj.cMarker.getPosition();
			}
			
			function i(){
				var p=obj.oMarker.getPosition();
				var radius=obj.mapobj.getDistance(p,obj.cMarker._lnglat);
				obj.circle.setRadius(radius);
			}
			
			function e(){
				obj.mapobj.unbind(obj.oMarker,"dragging",i);
				obj.mapobj.unbind(obj.oMarker,"mouseup",arguments.callee);
				delete obj.cMarker._lnglat;
			}
			this.oMarker=this.mBuildMarker(this.mapobj.getLngLatByOffset(this.circle.getCenter(),this.circle.getRadius(),0));
			this.mapobj.addOverlays(this.oMarker);
			this.mapobj.bind(this.oMarker,"mousedown",d);
		},
		edit:function(){
			function initMarker(){
				this.mCreateCenterMarker();
				this.mCreateOuterMarker();
			}
			this.flag&&!this.cMarker&&(this.mEnv(initMarker));
			this.mVisible("cMarker",true);
			this.mVisible("oMarker",true);
		},
		mVisible:function(marker,bool){
			typeof this[marker]!=="undefined"&&this[marker].setVisible(bool);
		},
		close:function(){
			this.mVisible("cMarker",false);
			this.mVisible("oMarker",false);
		},
		cancle:function(){
			typeof this.circle!=="undefined"&&delete this.polyline["_edit"];
			typeof this.cMarker!=="undefined"&&this.close();
			for(v in this){
				this.hasOwnProperty(v)&&delete this[v];
			}
		}
		
	})
})()